<?php

namespace app\common\model\system;


use app\common\model\BaseModel;
use think\Exception;
use yiqiniu\extend\facade\Db;

/**
 * 系统管理部门
 * Class SystemDepartment
 * @package app\model
 */
class SystemDepartmentModel extends BaseModel
{
    //
    public string $fieldId = 'id';

    //  
    public string $fieldCode = 'code';
    // 部门编码
    public string $fieldTitle = 'title';
    // 部门名称
    public string $fieldPid = 'pid';
    // 父级部门
    public string $fieldTreePath = 'tree_path';
    // 部门路径
    public string $fieldDepth = 'depth';
    // 部门层级
    public string $fieldChild = 'child';
    // 子部门数
    public string $fieldSort = 'sort';
    // 排序
    public string $fieldOpUser = 'op_user';
    // 操作人
    public string $fieldCreateAt = 'create_at';
    // 创建时间
    public string $fieldUpdateAt = 'update_at';
    // 更新时间
    protected $name = 'system_department';

    // 设置字段信息
    protected $schema = [
        'id' => 'int',        //
        'code' => 'string',        // 部门编码
        'title' => 'string',        // 部门名称
        'pid' => 'int',        // 父级部门
        'tree_path' => 'string',        // 部门路径
        'depth' => 'int',        // 部门层级
        'child' => 'int',        // 子部门数
        'sort' => 'int',        // 排序
        'op_user' => 'int',        // 操作人
        'create_at' => 'datetime',        // 创建时间
        'update_at' => 'datetime',        // 更新时间
    ];

    /**
     * 获取子部门所有ID
     * @param $pid
     * @return array
     * @throws Exception
     */
    public function childIds($pid): array
    {
        if (empty($pid)) {
            throw new Exception("父级ID不能为空", API_ERROR);
        }
        $path = $this->where("id", $pid)->value(null, "tree_path");
        if (empty($path)) {
            $path = $pid;
        } else {
            $path .= "," . $pid;
        }

        $data = $this->db()->removeOption()
            ->whereRaw("concat(',',tree_path,',') like '," . $path . ",%'")
            ->column('id');

        $data[] = $pid;
        return $data;
    }

    /**
     * 删除部门
     * @param int $id 部门ID
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \yiqiniu\extend\exception\ApiException
     */
    public function deptDel($id)
    {
        $info = $this->db()->where('id', $id)->field('child,pid')->find();
        if (empty($info)) {
            api_exception(API_ERROR, '部门不存在或已删除，请刷新后重试');
        }
        if ($info['child'] > 0) {
            api_exception(API_ERROR, '请先选择删除子部门');
        }
        $this->db()->where('id', $id)->delete();
        if ($info['pid'] > 0) {
            $this->updateParentIDNum($info['pid'], false);
        }
    }

    /**
     * 更新父ID的节点数量
     * @param $id
     * @param $flag  true: 加1  false 减1
     * @return int
     * @throws \think\db\exception\DbException
     */
    private function updateParentIDNum($id, bool $flag = true)
    {
        $update = ['child' => Db::raw('child' . ($flag ? '+' : '-') . '1')];
        return $this->db()->removeOption()->where('id', $id)->where('child', '>', 0)->update($update);
    }

    /**
     * 新增或修改
     * @param $params
     * @return int|string|void
     * @throws \think\Exception
     */
    public function addEdit($params)
    {
        return $this->treeAddEdit($params);
    }
}
